package com.shc.xsocket.demo1;

import org.xsocket.MaxReadSizeExceededException;
import org.xsocket.Resource;
import org.xsocket.connection.*;

import java.io.IOException;
import java.nio.BufferUnderflowException;
import java.nio.channels.ClosedChannelException;

/**
 * Created by shihuacai on 2015/12/31.
 */
public class ServerHandler implements IDataHandler, IConnectHandler, IIdleTimeoutHandler, IConnectionTimeoutHandler, IDisconnectHandler {

    @Resource
    IServer server;

    /**
     * 即当建立完连接之后可以进行的一些相关操作处理。包括修改连接属性、准备资源、等！
     * 连接的成功时的操作
     */
    @Override
    public boolean onConnect(INonBlockingConnection nbc) throws IOException,
            BufferUnderflowException, MaxReadSizeExceededException {
        String remoteName = nbc.getRemoteAddress().getHostName();
        System.out.println("服务器信息 : 客户端  " + remoteName + " 已经连接...");
        return true;
    }

    /**
     * 即如果失去连接应当如何处理？
     * 需要实现 IDisconnectHandler  这个接口
     * 连接断开时的操作
     */
    @Override
    public boolean onDisconnect(INonBlockingConnection nbc) throws IOException {
        String remoteName = nbc.getRemoteAddress().getHostName();
        System.out.println("服务器信息:客户端 " + remoteName + " 已经断开.");
        return false;
    }

    /**
     * 即这个方法不光是说当接收到一个新的网络包的时候会调用而且如果有新的缓存存在的时候也会被调用。而且
     * The onData will also be called, if the connection is closed当连接被关闭的时候也会被调用的!
     */
    @Override
    public boolean onData(INonBlockingConnection nbc) throws IOException,
            BufferUnderflowException, ClosedChannelException,
            MaxReadSizeExceededException {
        String data = nbc.readStringByDelimiter("|");
        nbc.write("--|server:receive data from client sucessful| -----");
        nbc.flush();
        System.out.println(data);
        return true;
    }

    /**
     * 请求处理超时的处理事件
     */
    @Override
    public boolean onIdleTimeout(INonBlockingConnection connection) throws IOException {
        System.out.println("客户端与服务端已长时间未通信，服务端将强制断开该客户端的连接");
        return false;
    }

    /**
     * 连接超时处理事件
     */
    @Override
    public boolean onConnectionTimeout(INonBlockingConnection connection) throws IOException {
        return false;
    }

}